home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / source / blt / bltddi.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-09  |  3.4 KB  |  141 lines

  1. /*----------------------------------------------------------------------------*\
  2.  
  3.     draws a bitmap by calling OEMBitBlt directly, this is used to measure the
  4.     GDI overhead in calling GDI!BitBlt
  5.  
  6. \*----------------------------------------------------------------------------*/
  7.  
  8. #include <windows.h>
  9. #include <windowsx.h>
  10. #include "blt.h"
  11.  
  12. /*----------------------------------------------------------------------------*\
  13. \*----------------------------------------------------------------------------*/
  14.  
  15. LPVOID      lpPDevice;
  16. LPVOID      lpPBitmap;
  17. BYTE        DrawMode[128];        // drawmode
  18. BYTE        PBrush[128];          // brush
  19.  
  20. static LPVOID GetPDevice(HDC hdc);
  21. static LPVOID GetPBitmap(HBITMAP hbm);
  22.  
  23. /*----------------------------------------------------------------------------*\
  24. \*----------------------------------------------------------------------------*/
  25.  
  26. #define GETAPI(mod, api) GetProcAddress(GetModuleHandle(mod),MAKEINTATOM(api))
  27.  
  28. //
  29. // DISPLAY.1
  30. static UINT (FAR PASCAL *OEMBitBlt)(LPVOID lpDestDevice, int xDst, int yDst,
  31.     LPVOID lpSrcDevice, int xSrc, int ySrc, int dx, int dy,
  32.     DWORD  Rop3, LPVOID lpPBrush, LPVOID lpDrawMode);
  33.  
  34. // GDI.403
  35. static HANDLE (FAR PASCAL *GDIGetBitmapHandle)(HBITMAP hbm, HANDLE h);
  36.  
  37. /*----------------------------------------------------------------------------*\
  38. \*----------------------------------------------------------------------------*/
  39.  
  40. void DrawDDI(HDC hdc, int x, int y, int dx, int dy)
  41. {
  42.     DWORD dw;
  43.  
  44.     dw = GetDCOrg(hdc);
  45.  
  46.     x = x + LOWORD(dw);
  47.     y = y + HIWORD(dw);
  48.  
  49.     OEMBitBlt(lpPDevice, x, y, lpPBitmap, 0, 0, dx, dy, SRCCOPY, &PBrush, &DrawMode);
  50. }
  51.  
  52. /*----------------------------------------------------------------------------*\
  53. \*----------------------------------------------------------------------------*/
  54.  
  55. BOOL InitDDI()
  56. {            
  57.     HDC hdc;
  58.  
  59.     (FARPROC&)OEMBitBlt          = GETAPI("DISPLAY", 1);
  60.     (FARPROC&)GDIGetBitmapHandle = GETAPI("GDI", 403);
  61.  
  62.     hdc = GetDC(NULL);
  63.     lpPDevice = GetPDevice(hdc);
  64.     ReleaseDC(NULL, hdc);
  65.  
  66.     if (lpPDevice == NULL || OEMBitBlt == NULL)
  67.         return FALSE;
  68.  
  69.     //
  70.     // get PBitmap if one is around
  71.     //
  72.     if (hbmApp)
  73.         lpPBitmap = GetPBitmap(hbmApp);
  74.  
  75.     return TRUE;
  76. }
  77.  
  78. //
  79. //  GetPBitmap()
  80. //
  81. static LPVOID GetPBitmap(HBITMAP hbm)
  82. {               
  83.     return GlobalLock(GDIGetBitmapHandle(hbm, 0));
  84. }
  85.  
  86. //
  87. // internal bitmap structure, used to get at bmlpPDevice
  88. //
  89. typedef struct {
  90.     BITMAP bm;
  91.     long  bmWidthPlanes;
  92.     long  bmlpPDevice;
  93. } IBITMAP;
  94.  
  95. //
  96. //  GetPDevice()
  97. //
  98. static LPVOID GetPDevice(HDC hdc)
  99. {               
  100.     HANDLE h;
  101.     HBITMAP hbm;
  102.     HBITMAP hbmT;
  103.     HDC hdcT;
  104.     IBITMAP FAR *pbm;
  105.     LPVOID lpPDevice = NULL;
  106.  
  107.     if (GDIGetBitmapHandle == NULL)
  108.         return NULL;
  109.  
  110.     hdcT = CreateCompatibleDC(hdc);
  111.     hbm  = CreateBitmap(1,1,1,1,NULL);
  112.     hbmT = SelectBitmap(hdcT, hbm);
  113.  
  114.     h = GDIGetBitmapHandle(hbm, 0);
  115.  
  116.     if (h == NULL)
  117.         goto exit;
  118.  
  119.     pbm = (IBITMAP FAR *)GlobalLock(h);
  120.  
  121.     if (IsBadReadPtr(pbm, sizeof(IBITMAP)))
  122.         goto exit;
  123.  
  124.     if (pbm)
  125.         pbm = (IBITMAP FAR *)pbm->bmlpPDevice;
  126.     else
  127.         pbm = NULL;
  128.  
  129.     if (IsBadReadPtr(pbm, sizeof(BITMAP)))
  130.         goto exit;
  131.  
  132.     lpPDevice = (LPVOID)pbm;
  133.  
  134. exit:
  135.     SelectObject(hdcT, hbmT);
  136.     DeleteObject(hdcT);
  137.     DeleteObject(hbm);
  138.  
  139.     return lpPDevice;
  140. }
  141.